package io.renren.modules.information.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import io.renren.common.utils.PageUtils;
import io.renren.common.utils.Query;
import io.renren.common.utils.R;
import io.renren.modules.collecting.dao.CollectingDeviceDao;
import io.renren.modules.collecting.entity.CollectingDeviceEntity;
import io.renren.modules.information.dao.InformationDao;
import io.renren.modules.information.entity.DataReportEntity;
import io.renren.modules.information.entity.InformationEntity;
import io.renren.modules.information.entity.InformationVoEntity;
import io.renren.modules.information.entity.LineChartVoEntity;
import io.renren.modules.information.service.InformationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class InformationServiceImpl implements InformationService {

    @Autowired
    private InformationDao informationMapper;
    @Autowired
    private CollectingDeviceDao collectingDeviceMapper;

    /**
     * 数据采集模块
     * 查询每个设备的最新一条数据
     */
    @Override
    public PageUtils getList(Map<String, Object> params) {

        IPage<InformationEntity> page = informationMapper.getList(new Query<InformationEntity>().getPage(params), params);
        return new PageUtils(page);
    }

    /**
     * 数据采集模块
     * 查询单个设备的数据集合
     */
    @Override
    public R getPage(Map<String, Object> params) {
        //获取设备详情
        CollectingDeviceEntity device = collectingDeviceMapper.get(Integer.valueOf(String.valueOf(params.get("deviceId"))));

        IPage<InformationEntity> page = informationMapper.getPage(new Query<InformationEntity>().getPage(params), params);

        InformationVoEntity vo = new InformationVoEntity();
        vo.setDeviceId(device.getId());
        vo.setDeviceName(device.getDeviceName());
        vo.setDeviceRemark(device.getDeviceRemark());
        vo.setDataList(page);
        return R.ok(vo);
    }

    /**
     * 数据采集模块
     * 查询单个设备的数据集合
     * 获取折线图数据
     */
    @Override
    public R getLineChart(String deviceId) {
        List<InformationEntity> lineChart = informationMapper.getLineChart(deviceId);
        LineChartVoEntity vo = new LineChartVoEntity();
        vo.setJcqdz1(lineChart.stream().map(InformationEntity::getJcqdz1).collect(Collectors.toList()));
        vo.setJcqdz2(lineChart.stream().map(InformationEntity::getJcqdz2).collect(Collectors.toList()));
        vo.setJcqdz3(lineChart.stream().map(InformationEntity::getJcqdz3).collect(Collectors.toList()));
        vo.setJcqdz4(lineChart.stream().map(InformationEntity::getJcqdz4).collect(Collectors.toList()));
        vo.setJcqdz5(lineChart.stream().map(InformationEntity::getJcqdz5).collect(Collectors.toList()));
        vo.setJcqdz6(lineChart.stream().map(InformationEntity::getJcqdz6).collect(Collectors.toList()));
        vo.setJcqdz7(lineChart.stream().map(InformationEntity::getJcqdz7).collect(Collectors.toList()));
        vo.setJcqdz8(lineChart.stream().map(InformationEntity::getJcqdz8).collect(Collectors.toList()));
        vo.setJcqdz9(lineChart.stream().map(InformationEntity::getJcqdz9).collect(Collectors.toList()));
        vo.setJcqdz10(lineChart.stream().map(InformationEntity::getJcqdz10).collect(Collectors.toList()));
        vo.setJcqdz11(lineChart.stream().map(InformationEntity::getJcqdz11).collect(Collectors.toList()));
        vo.setJcqdz12(lineChart.stream().map(InformationEntity::getJcqdz12).collect(Collectors.toList()));
        vo.setJcqdz13(lineChart.stream().map(InformationEntity::getJcqdz13).collect(Collectors.toList()));
        vo.setJcqdz14(lineChart.stream().map(InformationEntity::getJcqdz14).collect(Collectors.toList()));
        vo.setJcqdz15(lineChart.stream().map(InformationEntity::getJcqdz15).collect(Collectors.toList()));
        vo.setCreateTime(lineChart.stream().map(InformationEntity::getCreateTime).collect(Collectors.toList()));
        return R.ok(vo);
    }

    //数据报表模块-采集数据
    @Override
    public PageUtils getDataList(Map<String, Object> params) {
        IPage<InformationEntity> page = informationMapper.getDataList(new Query<InformationEntity>().getPage(params), params);

        return new PageUtils(page);
    }

    //数据报表模块-生成报告
    @Override
    public R addReport(Integer spaceId, String startTime, String endTime) {
        //查询数据集合
        List<InformationEntity> list = informationMapper.getDataList1(spaceId, startTime, endTime);
        //保存报告数据
        DataReportEntity dataReport = new DataReportEntity();
        dataReport.setSpaceId(spaceId);
        dataReport.setStartTime(startTime);
        dataReport.setEndTime(endTime);
        dataReport.setReportTime(new Date());
        List<Integer> ids = list.stream().map(InformationEntity::getId).collect(Collectors.toList());
        dataReport.setDataList(String.valueOf(ids));
        informationMapper.addReport(dataReport);
        return R.ok("报告生成成功");
    }

    //数据报表模块-报告列表
    @Override
    public PageUtils getReportList(Map<String, Object> params) {

        IPage<DataReportEntity> page = informationMapper.getReportList(new Query<InformationEntity>().getPage(params), params);
        return new PageUtils(page);
    }

    @Override
    public R deleteReport(Integer id) {
        informationMapper.deleteReport(id);
        return R.ok("删除成功");
    }

    @Override
    public InformationEntity getReport(Integer id) {
        String dataList = informationMapper.getReportDetails(id);

        InformationEntity report = new InformationEntity();
        String substring = dataList.substring(1, dataList.length() - 1);
        List<String> list = Arrays.asList(substring.split(","));

        if (null != list && list.size() > 0 && !"[]".equals(dataList)) {
             report = informationMapper.getReport(list);

            BigDecimal jcqdz1q = new BigDecimal("500");//CO2
            BigDecimal jcqdz1z = new BigDecimal("700");//CO2
            BigDecimal jcqdz1 = new BigDecimal(report.getJcqdz1());//CO2
            if (jcqdz1q.compareTo(jcqdz1) == 1) {
                report.setJcqdz1("平均浓度为[" + report.getJcqdz1() + "]，小于标准限值");
            } else  if (jcqdz1z .compareTo(jcqdz1) == -1) {
                report.setJcqdz1("平均浓度为[" + report.getJcqdz1() + "]，大于标准限值");
            } else {
                report.setJcqdz1("平均浓度为[" + report.getJcqdz1() + "]，符合标准要求");
            }

            BigDecimal jcqdz2z = new BigDecimal("50");//PM2.5
            BigDecimal jcqdz2 = new BigDecimal(report.getJcqdz2());//PM2.5
            if (jcqdz2z.compareTo(jcqdz2) == 1) {
                report.setJcqdz2("平均浓度为[" + report.getJcqdz2() + "]，符合标准要求");
            } else {
                report.setJcqdz2("平均浓度为[" + report.getJcqdz2() + "]，大于标准限值");
            }

            report.setJcqdz3("浓度维持在[" + report.getJcqdz3() + "]，正常");

            BigDecimal jcqdz4z = new BigDecimal("0.5");//TVOC
            BigDecimal jcqdz4 = new BigDecimal(report.getJcqdz4());//TVOC
            if (jcqdz4z.compareTo(jcqdz4) == 1) {
                report.setJcqdz4("平均浓度为[" + report.getJcqdz4() + "]，符合标准要求");
            } else {
                report.setJcqdz4("平均浓度为[" + report.getJcqdz4() + "]，大于标准限值");
            }

            BigDecimal jcqdz5z = new BigDecimal("10");//硫化氢
            BigDecimal jcqdz5 = new BigDecimal(report.getJcqdz5());//硫化氢
            if (jcqdz5z.compareTo(jcqdz5) == 1) {
                report.setJcqdz5("平均浓度为[" + report.getJcqdz5() + "]，符合标准要求");
            } else {
                report.setJcqdz5("平均浓度为[" + report.getJcqdz5() + "]，大于标准限值");
            }

            BigDecimal jcqdz6q = new BigDecimal("18");//温度
            BigDecimal jcqdz6z = new BigDecimal("25");//温度
            BigDecimal jcqdz6 = new BigDecimal(report.getJcqdz6());//温度
            if (jcqdz6q.compareTo(jcqdz6) == 1) {
                report.setJcqdz6("平均值为[" + report.getJcqdz6() + "]，小于标准限值");
            } else  if (jcqdz6z.compareTo(jcqdz6) == -1) {
                report.setJcqdz6("平均值为[" + report.getJcqdz6() + "]，大于标准限值");
            } else {
                report.setJcqdz6("平均值为[" + report.getJcqdz6() + "]，在标准区间内");
            }

            BigDecimal jcqdz7q = new BigDecimal("30");//湿度
            BigDecimal jcqdz7z = new BigDecimal("80");//湿度
            BigDecimal jcqdz7 = new BigDecimal(report.getJcqdz7());//湿度
            if (jcqdz7q.compareTo(jcqdz7) == 1) {
                report.setJcqdz7("平均值为[" + report.getJcqdz7() + "]，小于标准限值");
            } else  if (jcqdz7z.compareTo(jcqdz7) == -1) {
                report.setJcqdz7("平均值为[" + report.getJcqdz7() + "]，大于标准限值");
            } else {
                report.setJcqdz7("平均值为[" + report.getJcqdz7() + "]，处于合理范围");
            }

            BigDecimal jcqdz8z = new BigDecimal("0.12");//NO2
            BigDecimal jcqdz8 = new BigDecimal(report.getJcqdz8());//NO2
            if (jcqdz8z.compareTo(jcqdz8) == 1) {
                report.setJcqdz8("平均浓度为[" + report.getJcqdz8() + "]，符合标准要求");
            } else {
                report.setJcqdz8("平均浓度为[" + report.getJcqdz8() + "]，大于标准限值");
            }

            BigDecimal jcqdz9z = new BigDecimal("0.08");//甲醛
            BigDecimal jcqdz9 = new BigDecimal(report.getJcqdz9());//甲醛
            if (jcqdz9z.compareTo(jcqdz9) == 1) {
                report.setJcqdz9("平均浓度为[" + report.getJcqdz9() + "]，符合标准要求");
            } else {
                report.setJcqdz9("平均浓度为[" + report.getJcqdz9() + "]，大于标准限值");
            }

            BigDecimal jcqdz10q = new BigDecimal("0");//CO
            BigDecimal jcqdz10z = new BigDecimal("9");//CO
            BigDecimal jcqdz10 = new BigDecimal(report.getJcqdz10());//CO
            if (jcqdz10q.compareTo(jcqdz10) == 1) {
                report.setJcqdz10("平均浓度为[" + report.getJcqdz10() + "]，小于标准限值");
            } else  if (jcqdz10z.compareTo(jcqdz10) == -1) {
                report.setJcqdz10("平均浓度为[" + report.getJcqdz10() + "]，大于标准限值");
            } else {
                report.setJcqdz10("平均浓度为[" + report.getJcqdz10() + "]，符合标准要求");
            }

            BigDecimal jcqdz11q =  new BigDecimal("100");//光照度
            BigDecimal jcqdz11z =  new BigDecimal("300");//光照度
            BigDecimal jcqdz11 =  new BigDecimal(report.getJcqdz11());//光照度
            if (jcqdz11q.compareTo(jcqdz11) == 1) {
                report.setJcqdz11("平均光照为[" + report.getJcqdz11() + "]，小于标准限值");
            } else  if (jcqdz11z.compareTo(jcqdz11) == -1) {
                report.setJcqdz11("平均光照为[" + report.getJcqdz11() + "]，大于标准限值");
            } else {
                report.setJcqdz11("平均光照为[" + report.getJcqdz11() + "]，符合标准要求");
            }

            BigDecimal jcqdz13z =  new BigDecimal("60");//噪音
            BigDecimal jcqdz13 =  new BigDecimal(report.getJcqdz13());//噪音
            if (jcqdz13z.compareTo(jcqdz13) == 1) {
                report.setJcqdz13("平均噪音指数为[" + report.getJcqdz13() + "]，符合标准要求");
            } else {
                report.setJcqdz13("平均噪音指数为[" + report.getJcqdz13() + "]，大于标准限值");
            }

            BigDecimal jcqdz14z =  new BigDecimal("50");//PM10
            BigDecimal jcqdz14 =  new BigDecimal(report.getJcqdz14());//PM10
            if (jcqdz14z.compareTo(jcqdz14) == 1) {
                report.setJcqdz14("平均浓度为[" + report.getJcqdz14() + "]，符合标准要求");
            } else {
                report.setJcqdz14("平均浓度为[" + report.getJcqdz14() + "]，大于标准限值");
            }
        }
        return report;
    }

    @Override
    public PageUtils getEnvironmentList(Map<String, Object> params) {

        System.out.println(params.get("type"));

        IPage<Map<String, String>> page = informationMapper.getEnvironmentList(new Query<Map<String, String>>().getPage(params), params);
        return new PageUtils(page);
    }

    @Override
    public Map<String, String> getEnvironmentIndex() {
        Map<String, String> map = new HashMap<>();
        map.put("score", "36.8");
        map.put("appraise", "良");
        map.put("proposal", "基本无空气污染，各类人群可正常活动");
        return map;
    }

}
